const toString = Object.prototype.toString;

const is = (val, type) => {
  return toString.call(val) === `[object ${type}]`;
};

exports.is = is;

/**
 * @description:  是否为字符串
 */
exports.isString = (val) => {
  return is(val, "String");
};

/**
 * @description: 是否为对象
 */
exports.isObject = (val) => {
  return is(val, "Object");
};

/**
 * @description: 是否为数组
 */
exports.isArray = (val) => {
  return Array.isArray(val);
};

/**
 * @description:  是否为函数
 */
exports.isFunction = (val) => {
  return is(val, "Function");
};

/**
 * @description: 是否为空
 */
exports.isEmpty = (val) => {
  return (
    val === "" ||
    val === null ||
    val === undefined ||
    Object.getOwnPropertyNames(val).length === 0 ||
    val.length === 0
  );
};

/**
 * @description 校验一个值是否为密码类型
 * @param {*} value 需要进行校验的值
 * @param {*} lv 安全级别，1：至少8为任意字符，2：中级，至少包含字母、数字、特殊字符的八位数字，3：高级，至少包含大小写字母、数字、特殊字符的八位数字
 */
exports.isPwd = (value, lv = 2) => {
  const valids = {
    // 低
    1: /^.{8,}$/,
    // 中
    2: /^(?=.*[a-z])(?=.*\d)(?=.*[\W_]).{8,}$/,
    // 高
    3: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/,
  };

  return valids[lv].test(value);
};
